
class InvalidAgeException extends Exception {
    public InvalidAgeException(String message) {
        super(message);
    }
}
class Student{
    private String name;
    private int age;

    // 默认构造函数
    public Student() {
    }

    // 添加带参数的构造函数
    public Student(String name, int age) {
        this.name = name;
        this.age = age;
    }
    public int getAge() {
        return age;
    }
    public String getName() {
        return name;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "Student{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    /**
     * 从学生数组中删除指定索引位置的学生
     * 
     * @param s 原始学生数组
     * @param index 要删除的学生在数组中的索引位置
     * @return 删除指定学生后的新数组
     */
    public static Student[] deleteStudent(Student[] s, int index) {
        // 获取原始数组的长度
        int a = s.length;
        
        // 创建新数组，长度比原数组少1（因为要删除一个元素）
        Student[] students = new Student[a - 1];
        
        // 用于跟踪新数组的当前索引位置
        int newIndex = 0;
        
        // 遍历原始数组的所有元素
        for (int i = 0; i < s.length; i++) {
            // 如果当前索引不是要删除的索引，则将该元素复制到新数组中
            if (i != index) {
                // 将原数组中的元素赋值到新数组，并递增新数组的索引
                students[newIndex++] = s[i];
            }
            // 如果要删除的索引，则跳过不复制，实现删除效果
        }
        
        // 返回删除指定元素后的新数组
        return students;
    }

    /**
     * 根据下标删除数组元素，不改变原数组的特性、参数作用和返回值
     * 
     * @param s 原数组
     * @param index 要删除的数组索引
     * @return 新的数组
     */
    public static Student[] deleteStudentWithoutModify(Student[] s, int index) {
        // 创建新数组，长度比原数组少1（因为要删除一个元素）
        Student[] newStudents = new Student[s.length - 1];
        // 用于跟踪新数组的当前索引位置
        int newIndex = 0;
        // 遍历原数组
        for (int i = 0; i < s.length; i++) {
            // 如果当前索引不是要删除的索引，则将该元素复制到新数组中
            if (i != index) {
                newStudents[newIndex++] = s[i];
            }
            // 如果要删除的索引，则跳过不复制，实现删除效果
        }
        // 返回删除指定元素后的新数组
        return newStudents;
    }

    /**
     * 根据姓名查找元素
     * 
     * @param s 原数组
     * @param name 要查找的名字
     * @return 成功则返回查找出来的对象，失败返回null
     */
    public static Student searchStudent(Student[] s, String name){
         for(int i = 0; i < s.length; i++){
            if((s[i].name).equals(name)){
               return s[i];
            }
        }
        return null;
    }

    
    /**
     * 根据学生名字找到对应的学生对象，并更新其年龄
     * 
     * @param s 原数组
     * @param name 要查找的名字
     * @param age 修改年龄大小
     * @return 修改后的学生对象
     */
    public static Student updateStudentAge(Student[] s, String name, int age) throws InvalidAgeException {
        if (age < 0) {
            throw new InvalidAgeException("年龄不能为负数");
        }
        for(int i = 0; i < s.length; i++){
            if((s[i].name).equals(name)){
                s[i].age = age;
                return s[i];
            }
        }
        return null;
    }

    public static void main(String[] args) {
        Student[] students = new Student[5];
        //添加
        students[0] = new Student("Tom", 20);
        students[1] = new Student("Lin", 18);
        students[2] = new Student("Song", 21);
        students[3] = new Student("Pat", 22);
        students[4] = new Student("Coco", 20);

        //查找
        Student student1 = searchStudent(students, "Tom");
        Student student2 = searchStudent(students, "sss");
        System.out.println("Search successfully: " + student1);
        System.out.println("Search error: " + student2);

       //根据学生名字找到对应的学生对象，并更新其年龄
        System.out.println("Before update age: " + students[0]);
        try {
            Student student = updateStudentAge(students, "Tom", -1);
            System.out.println("Updated: " + student);
        } catch (InvalidAgeException e) {
            e.printStackTrace();
            System.err.println("更新年龄时出错: " + e.getMessage());
        }

        //删除前
        for(Student s : students){
            System.out.println(s);
        }

        //删除
        Student[] sss = deleteStudent(students,1);
        System.out.println("------------------Line------------------");

        //删除后
        for(Student s : sss){
            System.out.println(s);
        }
    }
}